package com.leigq.www.mybatisplusstudy.domain.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.leigq.www.mybatisplusstudy.constant.TableNameConstants;
import com.leigq.www.mybatisplusstudy.domain.entity.base.DeleteAndUpdateWithVersionEntity;
import com.leigq.www.mybatisplusstudy.enums.GenderEnum;
import lombok.*;
import lombok.experimental.Accessors;
import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder;

import java.math.BigDecimal;
import java.util.List;

/**
 * 部门表
 * Created by Mybatis Generator 2019/06/14
 *
 * @author leiguoqing
 */
@EqualsAndHashCode(callSuper = true)
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
@Accessors(chain = true)
@FieldNameConstants(level = AccessLevel.PRIVATE)
@TableName(value = TableNameConstants.STAFF, autoResultMap = true)
public class Staff extends DeleteAndUpdateWithVersionEntity {

    /**
     * 姓名
     */
    @TableField(value = "name")
    private String name;

    /**
     * 年龄
     */
    @TableField(value = "age")
    private Integer age;


    /**
     * 性别
     */
    @TableField(value = "gender")
    private GenderEnum gender;


    /**
     * 工龄
     */
    @TableField(value = "work_age")
    private Integer workAge;

    /**
     * 工资(月)
     */
    @TableField(value = "wages")
    private BigDecimal wages;

    /**
     * 部门id
     */
    @TableField(value = "d_id")
    private Long depId;


    /**
     * 爱好，可多个，存json
     * <br/>
     * <pre>
     *     typeHandler: 字段类型处理器
     *     注意！！ 必须开启映射注解 @TableName(autoResultMap = true)
     * </pre>
     */
    @TableField(value = "hobbies", typeHandler = JacksonTypeHandler.class)
    private List<String> hobbies;


    /**
     * 表字段名称，带表名称前缀，例如 department.name, 给自定义MP SQL使用
     */
    public interface TableColumns {
        /**
         * The constant name.
         */
        String NAME = getColumn(Fields.name);

        /**
         * The constant AGE.
         */
        String AGE = getColumn(Fields.age);


        /**
         * 特殊处理，数据库中的字段名是 is_deleted，实体里面是 deleted
         */
        String DELETED = getColumn(F.deleted);

        // 自行添加更多，如果数据库和实体里面的名字不一样，则 getColumn() 里面直接传数据库的字段名....
    }


    /**
     * 获取表字段名称，一定要带表名称前缀，例如 staff.name, 给自定义MP SQL使用
     *
     * @param fieldName 实体类中的属性名称，如果数据库和实体里面的名字不一样，则直接传数据库的字段名
     * @return the column name
     */
    private static String getColumn(String fieldName) {
        return TableNameConstants.STAFF + "." + getColumnName(fieldName);
    }
}